package com.jihu.design.structural.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author jihu
 * @date 2021/9/23
 */
public class JdkTikTokProxy<T>  implements InvocationHandler {

    private Object target;

    //接收被代理对象
    public JdkTikTokProxy(T target){
        this.target = target;
    }


    /**
     * 获取被代理对象的 代理对象
     * @param t
     * @param <T>
     * @return
     */
    public static <T> T getProxy( T t) {
        /**
         * ClassLoader loader, 当前被代理对象类加载器
         * Class<?>[] interfaces, 当前被代理对象所实现的所有接口
         * InvocationHandler h
         *  当前被代理器执行目标方法的时候使用h定义拦截增强方法
         *
         */
        Object o = Proxy.newProxyInstance(
                t.getClass().getClassLoader(),
                t.getClass().getInterfaces(),
                new JdkTikTokProxy(t));
        return (T)o;
    }

    /**
     * 定义目标方法的拦截逻辑 每个方法都会执行
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //反射执行
        System.out.println("真正执行被代理对象的方法");
        Object invoke = method.invoke(target, args);
        System.out.println("返回值:"+invoke);
        return invoke;
    }
}
